package com.zcl.IO.file;

import org.junit.Test;

import java.io.*;

/**
 * @Description:
 * @author: zcl
 * @date: 2022/3/14  15:52
 *
 * 一.流的分类:
 *  1.操作数据单位: 字节流,字符流
 *  2.数据的流向: 输入流,输出流
 *  3.流的角色: 节点流, 处理流
 *
 * 二. 流的体系结构
 * 抽象流              节点流(或文件流)           缓冲流(处理流的一种)
 * InputStream        FileInputStream         BufferedInputStream
 * OutputStream       FileOutputStream        BufferedOutputStream
 * Reader             FileReader              BufferedReader
 * Writer             FileWriter              BufferedWriter
 */
public class FileReaderWriterTest {

    public static void main(String[] args) {
    }

    /**
     * 将hello.txt读入程序中,并输出
     */
    @Test
    public void testFileReader() {
        FileReader fileReader = null;
        try {
            //1.实例化File类的对象,并指明要操作的对象
            File file = new File("src\\com\\zcl\\IO\\file\\hello.txt");
            fileReader = new FileReader(file);
            //read(): 返回读入的一个字符, 如果达到文件末尾,返回-1
            int read = fileReader.read();
            while (read != -1){
                System.out.print((char)read);
                read = fileReader.read();
            }
        } catch (IOException ioException) {
            ioException.printStackTrace();
        } finally {
            try {
                //流的关闭操作
                if (fileReader != null){
                    fileReader.close();
                }
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }

    //对read()操作审计: 使用read的重载方法
    @Test
    public  void  testFileReader1(){
        FileReader fileReader = null;
        try {
            //1.File类的实例化
            File file = new File("src\\com\\zcl\\IO\\file\\hello.txt");

            //2.FileReader流的实例化
            fileReader = new FileReader(file);

            //3.读入的操作
            //read(char[] chars):返回每次读入chars数组中的字符的个数,如果达到文件末尾,返回-1
            char[] chars = new char[10];
            int len = fileReader.read(chars);
            while (len  != -1){
//                for (int i = 0; i < len; i++) {
//                    System.out.println(chars[i]);
//                }
                String s = new String(chars, 0, len);
                System.out.println(s);
            }
        } catch (IOException ioException) {
            ioException.printStackTrace();
        } finally {
            if (fileReader != null){
                //4.资源的关闭
                try {
                    fileReader.close();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
    }

    /**
     *
     * @throws IOException
     *
     * 输出操作: 对应的file可以不存在,如果不存在,在输出过程中可以创建此文件
     *  new FileWriter(file, true): 表示写入到file,如果file对应硬盘中的文件已存在,在file文件后面追加内容;false是对文件的覆盖
     *
     */
    @Test
    public void testFileWriter() throws IOException {
        //1.提供File类的对象,指明写出到的文件
        File file = new File("src\\com\\zcl\\IO\\file\\hello1.txt");

        //2.提供FileWriter的对象,用于数据的写出
        FileWriter fileWriter = new FileWriter(file);
        //3.写出的操作
        fileWriter.write("i have a dream\n");
        fileWriter.write("hahahahsdjfaksdbfkja");
        //4.流资源的关闭
        fileWriter.close();
    }


    @Test
    public void testFileReaderWriter()  {
        FileReader fileReader = null;
        FileWriter fileWriter = null;
        try {
            //1.创建file类对象:指明读入和写出的对象
            File fileRead = new File("src\\com\\zcl\\IO\\file\\read.txt");
            File fileWrite = new File("src\\com\\zcl\\IO\\file\\writer.txt");

            //2.创建输入流和输出流的对象
            fileReader = new FileReader(fileRead);
            fileWriter = new FileWriter(fileWrite,true);

            //3.数据的读入和写出
            char[] cbuf = new char[10];
            int len; //记录每次读入到cbuf数组中的字符个数
            while ((len= fileReader.read(cbuf)) != -1){
                fileWriter.write(cbuf, 0, len);
            }
        } catch (IOException ioException) {
            ioException.printStackTrace();
        } finally {
            //4.关闭流
            try {
                fileWriter.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
            try {
                fileReader.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }



}
